package cn.hpclub.server.plugin;

import org.nutz.ssdb4j.spi.Response;
import org.nutz.ssdb4j.spi.SSDB;

public class Cache{
    
    final String name;
    final SSDB ssdb;

    private final ThreadLocal<SSDB> threadLocalSsdb = new ThreadLocal<SSDB>();

    Cache(String name, SSDB ssdb) {
        this.name = name;
        this.ssdb = ssdb;
    }
    
    /**
     * 存放 key value 对到 redis
     * 如果 key 已经持有其他值， SET 就覆写旧值，无视类型。
     * 对于某个原本带有生存时间（TTL）的键来说， 当 SET 命令成功在这个键上执行时， 这个键原有的 TTL 将被清除。
     */
    public Response set(Object key, Object value) {
        SSDB ssdb = getSsdb();
        return ssdb.set(key,value);
    }
    /**
     * 存放 key value 对到 redis，并将 key 的生存时间设为 seconds (以秒为单位)。
     * 如果 key 已经存在， SETEX 命令将覆写旧值。
     */
    public Response setex(Object key, int seconds, Object value) {
        SSDB ssdb = getSsdb();
        return ssdb.setx(key,value,seconds);
    }
    
    /**
     * 返回 key 所关联的 value 值
     * 如果 key 不存在那么返回特殊值 nil 。
     */
    public Response get(Object key) {
        SSDB ssdb = getSsdb();
        
        return ssdb.get(key);
        
    }
    
    /**
     * 删除给定的一个 key
     * 不存在的 key 会被忽略。
     */
    public Response del(Object key) {
        SSDB ssdb = getSsdb();
        
        return ssdb.del(key);
    }
    
    /**
     * 将哈希表 key 中的域 field 的值设为 value 。
     * 如果 key 不存在，一个新的哈希表被创建并进行 HSET 操作。
     * 如果域 field 已经存在于哈希表中，旧值将被覆盖。
     */
    public Response hset(Object key, Object field, Object value) {
        SSDB ssdb = getSsdb();
        
        return ssdb.hset(key, field, value);
    }
    
    /**
     * 返回哈希表 key 中给定域 field 的值。
     */
    public Response hget(Object key, Object field) {
        SSDB ssdb = getSsdb();
        
        return ssdb.hget(key, field);
    }
    
    /**
     * 删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。
     */
    public Response hdel(Object key, Object... fields) {
        SSDB ssdb = getSsdb();
        return ssdb.hdel(key, fields);
    }
    
    /**
     * 查看哈希表 key 中，给定域 field 是否存在。
     */
    public Response hexists(Object key, Object field) {
        SSDB ssdb = getSsdb();
        
        return ssdb.hexists(key, field);
    }
    
    /**
     * 返回哈希表 key 中，所有的域和值。
     * 在返回值里，紧跟每个域名(field name)之后是域的值(value)，所以返回值的长度是哈希表大小的两倍。
     */
    public Response hgetAll(Object key) {
        SSDB ssdb = getSsdb();
        
        return ssdb.hgetall(key);
    }
    // ---------
    
    public String getName() {
        return name;
    }
    
    // ---------
    
    public SSDB getSsdb() {
        SSDB ssdb = threadLocalSsdb.get();
        return ssdb != null ? ssdb : this.ssdb;
    }
    
    // ---------
    public SSDB getThreadLocalSsdb(){
        return threadLocalSsdb.get();
    }
    
    public void setThreadLocalSsdb(SSDB ssdb) {
        threadLocalSsdb.set(ssdb);
    }
    
    public void removeThreadLocalSsdb() {
        threadLocalSsdb.remove();
    }
}
